home *** CD-ROM | disk | FTP | other *** search
- static char diffdate_prog[] = "@(#)long diffdate(char *d1,char *d2) - Datumsdifferenzen in Tagen";
- static char diffdate_ver[] = "@(#)v1.11/kr ; 22.08.91";
- /* Autor Klaus Rath
- **
- ** Deklaration long diffdate(char *datum1, char *datum2);
- **
- ** Übergabe Erwartet werden 2 Strings in folgenden optionalen Formaten:
- ** tt.mm.[[jj]jj] -- deutsches Format
- ** mm/tt[/[jj]jj] -- amerikanisches Format
- ** [jj]jjmmtt -- DDB/4-Format
- ** wobei der Trenner '.' oder '/' bestimmt, ob deutsches oder
- ** amerikanisches Datumsformat berücksichtigt wird - bzw. Daten-
- ** bankformat, falls kein Trenner vorhanden ist. Da die beiden
- ** Datümer einzeln geprüft und konvertiert werden, dürfen unter-
- ** schiedliche Formate verwendet werden! Falls kein Jahrhundert
- ** mit übergeben wurde, nimmt die Funktion an, daß das aktuelle
- ** gemeint ist und holt es sich aus der Systemzeit!
- ** Rückgabe Zurückgegeben wird die Differenz in Tagen als long-Wert.
- ** Da eine Differenz von 0 Tagen ja durchaus vorkommen kann, eignet
- ** sich die 0 nicht als Fehlerkennung. diffdate gibt für diesen
- ** Fall die Zahl 90909090 zurück, deren normales Zustandekommen
- ** ziemlich unwahrscheinlich sein dürfte.
- ** Anmerkung Die Funktion verwendet die Funktionen schalt_jahr und anz_schaltj,
- ** die entsprechend mit eingebunden werden müssen.
- ** Der Bereich, in dem diffdate arbeiten kann, liegt
- ** zwischen dem 01.01.0000 und dem 31.12.9999 !!!
- ** Änderungen 1.00 ; 12.04.91
- ** Erste vollwertige Version
- ** 1.10 ; 20.05.91
- ** Anpassung an die Formate tt.mm. und mm/tt, bei denen auch
- ** das Jahr durch das aktuelle belegt werden muß.
- ** Benutzung der Funktion anz_schaltjahre().
- ** 1.11 ; 22.08.91
- ** Fehler beseitigt, der zur Differenz von einem Tag führte,
- ** wenn Ergebnis negativ war und das erste Datum in einem
- ** Schaltjahr liegt. Die Monatslängensetzung mlaen[2] muß dann
- ** wieder auf 28 zurückgesetzt werden!!
- */
-
- #include <time.h>
- #include <string.h>
- #include <stdio.h>
- #include <sys\types.h>
- #ifdef __TURBOC__
- #include <stdlib.h>
- #endif
- #include "datum.h"
-
- long diffdate(char *date1, char *date2)
- {
- long tages_summe1,tages_summe2;
- long ergebnis;
- long jahreszahl1,jahreszahl2;
- char t_s1[3],t_s2[3],m_s1[3],m_s2[3],j_s1[3],j_s2[3],jh_s1[3],jh_s2[3];
- long tage1,tage2,monate1,monate2,jahre1,jahre2,jh1,jh2;
- int laenge1,laenge2;
- char systemzeit_s[26];
- time_t systemzeit;
- long zaehler;
- long mlaen[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
- long anz_sj;
-
- /* Längenüberprüfung :
- */
- laenge1 = strlen(date1);
- if ( laenge1 == 6 || laenge1 == 8 || laenge1 == 10 || laenge1 == 5 )
- ;
- else
- return((long)FEHLER);
- laenge2 = strlen(date2);
- if ( laenge2 == 6 || laenge2 == 8 || laenge2 == 10 || laenge2 == 5 )
- ;
- else
- return((long)FEHLER);
-
- /* Jahrhundert und Jahr aus der Systemzeit ermitteln und vorbelegen :
- */
- time(&systemzeit);
- strcpy(systemzeit_s,ctime(&systemzeit));
- jh_s1[0] = systemzeit_s[20];
- jh_s1[1] = systemzeit_s[21];
- jh_s1[2] = '\0';
- j_s1[0] = systemzeit_s[22];
- j_s1[1] = systemzeit_s[23];
- j_s1[2] = '\0';
- jh_s2[0] = systemzeit_s[20];
- jh_s2[1] = systemzeit_s[21];
- jh_s2[2] = '\0';
- j_s2[0] = systemzeit_s[22];
- j_s2[1] = systemzeit_s[23];
- j_s2[2] = '\0';
-
- /* Format überprüfen und umkopieren :
- */
- /* 1. Datum :
- */
- if ( date1[2] == '.' && date1[5] == '.' ) { /* deutsches Format */
- t_s1[0] = date1[0];
- t_s1[1] = date1[1];
- t_s1[2] = '\0';
- m_s1[0] = date1[3];
- m_s1[1] = date1[4];
- m_s1[2] = '\0';
- if ( laenge1 == 10 ) {
- jh_s1[0] = date1[6];
- jh_s1[1] = date1[7];
- jh_s1[2] = '\0';
- j_s1[0] = date1[8];
- j_s1[1] = date1[9];
- j_s1[2] = '\0';
- }
- else if ( laenge1 == 8 ) {
- j_s1[0] = date1[6];
- j_s1[1] = date1[7];
- j_s1[2] = '\0';
- }
- else if ( laenge1 == 6 ) ;
- else
- return((long)FEHLER);
- } /* ENDE: Deutsches Format */
-
- else if ( date1[2] == '/' &&
- ( date1[5] == '/' || laenge1 == 5 ) ) { /* amerik.Format */
- t_s1[0] = date1[3];
- t_s1[1] = date1[4];
- t_s1[2] = '\0';
- m_s1[0] = date1[0];
- m_s1[1] = date1[1];
- m_s1[2] = '\0';
- if ( laenge1 == 10 ) {
- jh_s1[0] = date1[6];
- jh_s1[1] = date1[7];
- jh_s1[2] = '\0';
- j_s1[0] = date1[8];
- j_s1[1] = date1[9];
- j_s1[2] = '\0';
- }
- else if ( laenge1 == 8 ) {
- j_s1[0] = date1[6];
- j_s1[1] = date1[7];
- j_s1[2] = '\0';
- }
- else if ( laenge1 == 5 ) ;
- else
- return((long)FEHLER);
- } /* ENDE: Amerikanisches Format */
-
- else if ( atol(date1) != (long)NULL ) { /* Datenbank-Format */
- if ( laenge1 == 8 ) {
- jh_s1[0] = date1[0];
- jh_s1[1] = date1[1];
- jh_s1[2] = '\0';
- j_s1[0] = date1[2];
- j_s1[1] = date1[3];
- j_s1[2] = '\0';
- t_s1[0] = date1[6];
- t_s1[1] = date1[7];
- t_s1[2] = '\0';
- m_s1[0] = date1[4];
- m_s1[1] = date1[5];
- m_s1[2] = '\0';
- }
- else if ( laenge1 == 6 ) {
- j_s1[0] = date1[0];
- j_s1[1] = date1[1];
- j_s1[2] = '\0';
- t_s1[0] = date1[4];
- t_s1[1] = date1[5];
- t_s1[2] = '\0';
- m_s1[0] = date1[2];
- m_s1[1] = date1[3];
- m_s1[2] = '\0';
- }
- else
- return((long)FEHLER);
- } /* ENDE: Datenbankformat */
- else
- return((long)FEHLER);
- /* ENDE:if(Formatprüfung und Kopierung für 1.Datum) */
-
- /* 2. Datum :
- */
- if ( date2[2] == '.' && date2[5] == '.' ) { /* deutsches Format */
- t_s2[0] = date2[0];
- t_s2[1] = date2[1];
- t_s2[2] = '\0';
- m_s2[0] = date2[3];
- m_s2[1] = date2[4];
- m_s2[2] = '\0';
- if ( laenge2 == 10 ) {
- jh_s2[0] = date2[6];
- jh_s2[1] = date2[7];
- jh_s2[2] = '\0';
- j_s2[0] = date2[8];
- j_s2[1] = date2[9];
- j_s2[2] = '\0';
- }
- else if ( laenge2 == 8 ) {
- j_s2[0] = date2[6];
- j_s2[1] = date2[7];
- j_s2[2] = '\0';
- }
- else if ( laenge2 == 6 ) ;
- else
- return((long)FEHLER);
- } /* ENDE: Deutsches Format */
-
- else if ( date2[2] == '/' &&
- ( date2[5] == '/' || laenge2 == 5 ) ) { /* amerik.Format */
- t_s2[0] = date2[3];
- t_s2[1] = date2[4];
- t_s2[2] = '\0';
- m_s2[0] = date2[0];
- m_s2[1] = date2[1];
- m_s2[2] = '\0';
- if ( laenge2 == 10 ) {
- jh_s2[0] = date2[6];
- jh_s2[1] = date2[7];
- jh_s2[2] = '\0';
- j_s2[0] = date2[8];
- j_s2[1] = date2[9];
- j_s2[2] = '\0';
- }
- else if ( laenge2 == 8 ) {
- j_s2[0] = date2[6];
- j_s2[1] = date2[7];
- j_s2[2] = '\0';
- }
- else if ( laenge2 == 5 ) ;
- else
- return((long)FEHLER);
- } /* ENDE: Amerikanisches Format */
-
- else if ( atol(date2) != (long)NULL ) { /* Datenbank-Format */
- if ( laenge2 == 8 ) {
- jh_s2[0] = date2[0];
- jh_s2[1] = date2[1];
- jh_s2[2] = '\0';
- j_s2[0] = date2[2];
- j_s2[1] = date2[3];
- j_s2[2] = '\0';
- t_s2[0] = date2[6];
- t_s2[1] = date2[7];
- t_s2[2] = '\0';
- m_s2[0] = date2[4];
- m_s2[1] = date2[5];
- m_s2[2] = '\0';
- }
- else if ( laenge2 == 6 ) {
- j_s2[0] = date2[0];
- j_s2[1] = date2[1];
- j_s2[2] = '\0';
- t_s2[0] = date2[4];
- t_s2[1] = date2[5];
- t_s2[2] = '\0';
- m_s2[0] = date2[2];
- m_s2[1] = date2[3];
- m_s2[2] = '\0';
- }
- else
- return((long)FEHLER);
- } /* ENDE: Datenbankformat */
- else
- return((long)FEHLER);
- /* ENDE:if(Formatprüfung und Kopierung für 2.Datum) */
-
- /* Konvertierung :
- */
- if ( ( (tage1 = atol(t_s1)) == 0 )
- ||
- ( (monate1 = atol(m_s1)) == 0 )
- )
- return((long)FEHLER);
- jh1 = atol(jh_s1);
- jahre1 = atol(j_s1);
-
- if ( ( (tage2 = atol(t_s2)) == 0 )
- ||
- ( (monate2 = atol(m_s2)) == 0 )
- )
- return((long)FEHLER);
- jh2 = atol(jh_s2);
- jahre2 = atol(j_s2);
-
- if ( monate1 > 12L || monate1 < 0L || tage1 < 0L || jahre1 < 0L || jh1 < 0L ||
- monate2 > 12L || monate2 < 0L || tage2 < 0L || jahre2 < 0L || jh2 < 0L
- )
- return((long)FEHLER);
-
- jahreszahl1 = jh1*100L + jahre1;
- jahreszahl2 = jh2*100L + jahre2;
-
- tages_summe1 = 0L;
- tages_summe2 = 0L;
-
- /* Jahre aufaddieren :
- */
- anz_sj = anz_schaltjahre(jahreszahl1);
- tages_summe1 += (anz_sj * 366L);
- tages_summe1 += ((jahreszahl1 -anz_sj) * 365L);
- anz_sj = anz_schaltjahre(jahreszahl2);
- tages_summe2 += (anz_sj * 366L);
- tages_summe2 += ((jahreszahl2 -anz_sj) * 365L);
-
- /* Monate aufaddieren :
- */
- if ( schalt_jahr(jahreszahl1) )
- mlaen[2] = 29L;
- for ( zaehler = 0L ; zaehler < monate1 ; zaehler++ )
- tages_summe1 += mlaen[zaehler];
-
- mlaen[2] = 28L; /* Notwendige Neuinitialisierung !!! */
-
- if ( schalt_jahr(jahreszahl2) )
- mlaen[2] = 29L;
- for ( zaehler = 0L ; zaehler < monate2 ; zaehler++ )
- tages_summe2 += mlaen[zaehler];
-
- /* Tage aufaddieren :
- */
- tages_summe1 += tage1;
- tages_summe2 += tage2;
-
- /* Gesamtergebnis :
- */
- ergebnis = tages_summe2 - tages_summe1;
-
- return((long)ergebnis);
-
- } /* ENDE: diffdate() */
-